#include <stdio.h>
#include <omp.h>

void critical_work()
{
    int i = 1;

    // 使用 parallel sections 来并行化不同的代码段
    #pragma omp parallel sections
    {
        // 第一个并行执行的代码段
        #pragma omp section
        {
            // 使用 critical 指令确保只有一个线程能够访问此代码段
            #pragma omp critical(name)
            {
                // 在 critical 区域内使用 parallel 指令启动并行区域
                #pragma omp parallel
                {
                    // 使用 single 指令确保只有一个线程会执行这个代码块
                    #pragma omp single
                    {
                        // 增加 i 的值，这部分代码只会由一个线程执行
                        i++;
                    }
                }
            }
        }
    }

    // 打印最终的 i 值
    printf("Final value of i: %d\n", i);
}

int main()
{
    // 调用函数执行带有临界区的并行工作
    critical_work();

    return 0;
}
